package com.vk.project.service;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vk.project.common.DeleteRequest;
import com.vk.project.common.IdListRequest;
import com.vk.project.model.dto.user.UserAddRequest;
import com.vk.project.model.dto.user.UserQueryRequest;
import com.vk.project.model.dto.user.UserUpdateRequest;
import com.vk.project.model.vo.EmailRegisterVO;
import com.vk.project.model.vo.UserVO;
import com.vk.vkapiclientsdk.client.VkApiClient;
import com.vk.vkapicommon.model.entity.User;
import org.springframework.security.core.userdetails.UserDetailsService;

import javax.servlet.http.HttpServletRequest;

/**
 * @ClassName : UserService
 * @Description : 用户相关服务接口
 * @Author : LYQ
 * @Date: 2023-11-21 13:13:06
 */
public interface UserService extends IService<User>, UserDetailsService {

    /**
     * 用户注册接口
     *
     * @param userAccount   用户账户
     * @param userPassword  用户密码
     * @param checkPassword 校验密码
     * @return 新用户 id
     */
    long userRegister(String userAccount, String userPassword, String checkPassword);

    /**
     * 用户登录接口
     *
     * @param userAccount  用户账户
     * @param userPassword 用户密码
     * @param request      请求体
     * @return 脱敏后的用户信息
     */
    User userLogin(String userAccount, String userPassword, HttpServletRequest request);

    /**
     * 获取当前登录用户信息
     *
     * @param request 当前会话
     * @return 返回用户信息
     */
    User getLoginUser(HttpServletRequest request);

    /**
     * 判断是否为管理员
     *
     * @param request 请求体
     * @return 返回判断结果
     */
    boolean isAdmin(HttpServletRequest request);

    /**
     * 用户注销接口
     *
     * @param request 请求体
     * @return 返回注销结果
     */
    boolean userLogout(HttpServletRequest request);

    /**
     * 创建用户
     *
     * @param userAddRequest 用户创建请求对象
     * @param request        请求体
     * @return 操作结果，null表示正常，否则为错误原因
     */
    String addUser(UserAddRequest userAddRequest, HttpServletRequest request);

    /**
     * 更新用户
     *
     * @param userUpdateRequest 用户更新请求对象
     * @param request           请求体
     * @return
     */
    boolean updateUser(UserUpdateRequest userUpdateRequest, HttpServletRequest request);

    /**
     * 根据用户Id删除对应的用户
     * @param idListRequest 删除请求
     * @param request 当前会话
     * @return 返回删除结果
     */
    boolean deleteUserById(IdListRequest idListRequest, HttpServletRequest request);

    /**
     * 创建SDK客户端
     *
     * @param user 当前登录用户
     * @return 返回SDK客户端
     */
    VkApiClient getApiClient(HttpServletRequest request);

    /**
     * 根据用户名或者邮箱查询用户信息
     * @param text 用户名或者邮箱
     * @return 查询到的用户信息，无则返回null
     */
    User findUserByNameOrEmail(String text);

    /**
     * 分页查询用户信息
     *
     * @param userQueryRequest 查询条件
     * @param request 当前会话
     * @return 返回用户信息列表
     */
    Page<UserVO> listUserByPage(UserQueryRequest userQueryRequest, HttpServletRequest request);

    /**
     * 发送邮箱验证码
     * @param type 发送场景（注册，找回密码）
     * @param email 邮箱号
     * @param ip 用户IP地址
     * @return 邮箱验证码
     */
    String registerEmailVerifyCode(String type, String email, String ip);

    /**
     * 注册邮箱账号
     * @param info 用户注册表单信息对象
     * @return 操作结果，null表示正常，否则为错误原因
     */
    String registerEmailAccount(EmailRegisterVO info);
}
